package com.oms.core.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 通用DAO，与底层数据库交互，其他DAO继承该DAO
 * @author Loong_Mit
 * @date Sep 1, 2012 5:25:23 PM
 * @param <E>    实体类 
 * @param <PK>   主键类，必须实现Serializable接口 
 */

public interface IGeneralDAO<E, PK extends Serializable> {
	/** 
     * 插入一个实体（在数据库INSERT一条记录）
     * @param entity 实体对象 
     */  
    public void insert(E entity);

    /** 
     * 修改一个实体对象（UPDATE一条记录） 
     * @param entity 实体对象 
     * @return 修改的对象个数，正常情况=1 
     */  
    public int update(E entity); 

    /** 
     * 按主键删除记录 
     * @param primaryKey 主键对象 
     * @return 删除的对象个数，正常情况=1 
     */  
    public int delete(PK primaryKey);

    /** 
     * 查询整表总记录数 
     * @return 整表总记录数 
     */  
    public int count();
    
    /** 
     * 记录数 
     * @return 总记录数 
     */  
    public int getCount(String sqlId, Object parameters);

    /** 
     * 按主键取记录 
     * @param primaryKey 主键值 
     * @return 记录实体对象，如果没有符合主键条件的记录，则返回null 
     */  
    public E get(PK primaryKey);

    /** 
     * 取全部记录 
     * @return 全部记录实体对象的List 
     */  
    public List<E> getAll();
    
    /** 
     * 取全部记录 
     * @param params 参数
     * @return 全部记录实体对象的List 
     */  
    public List<E> getAll(Map<String, Object> params);

    /** 
     * 批量插入 
     * @param list 
     */  
    public void batchInsert(List<E> list);

    /** 
     * 批量修改 
     * @param list 
     */  
    public void batchUpdate(List<E> list);

    /** 
     * 批量删除 
     * @param list 
     */  
    public void batchDelete(List<PK> list);
    
    
    /**
     * 通过指定的statementId查询结果集
     * @param sqlId
     * @return
     */
    public List<E> queryForList(String sqlId);

    /**
     * 按照查询条件查询符合条件的全部记录
     * @param sqlId
     * @param parameters
     * @return
     */
    public List<E> queryForList(String sqlId,Object parameters) ;
    
    /**    
     * sql 查询.    
     * @param sql 直接sql的语句(需要防止注入式攻击)    
     */ 
    public List<E> queryForList(String sqlId, String sql);   
    
    /**    
     * map查询.    
    * @param map 包含各种属性的查询    
     */     
    public List<E> queryForList(String sqlId, Map<String, Object> map);      
    
    /**
     * 按照查询条件查询符合条件的记录
     * @param sqlId
     * @param parameters
     * @return
     */
    public E queryForObject(String sqlId, Object parameters);
    
    /**
     * 按照条件更新符合条件的记录
     * @param sqlId
     * @param parameters
     */
    public void update(String sqlId, Object parameters);
    
    /**
     * 按照条件删除符合条件的记录
     * @param sqlId
     * @param parameters
     */
    public void delete(String sqlId, Object parameters);
    /**
     * 插入一个实体（在数据库INSERT一条记录）
     * @param sqlId
     * @param entity
     */
	void insert(String sqlId, Object entity);
	
	/**
	 * 返回MAP的集合
	 * @param sql
	 * @param parameters
	 * @return
	 * Administrator
	 */
	public List<Map<String, Object>> getList(String sqlId, Object parameters);
	
	/**
	 * 返回MAP的集合
	 * @param sql
	 * @param parameters
	 * @return
	 * Administrator
	 */
	public List<Map<String, Object>> getList(String sqlId, Map<String, Object> map);
}
